const express = require('express');
const router = express.Router();
const { Chapter } = require('../../models');
const { Op } = require('sequelize');
console.log("Chapter", Chapter)
const {
    getChapter,
    success,
    failure
} = require('../../utils/responses');
const { NotFoundError } = require('../../utils/errors');
const { getChaptersCondition } = require("../../utils/conditions");

/**
 * 公共方法：白名单过滤
 * @param req
 * @returns {{rank: (number|*), video: (string|boolean|MediaTrackConstraints|VideoConfiguration|*), title, courseId: (number|*), content}}
 */
function filterBody(req) {
    return {
        courseId: req.body.courseId,
        title: req.body.title,
        content: req.body.content,
        video: req.body.video,
        rank: req.body.rank
    };
}


/**
 * 查询章节详情
 * GET /admin/chapters/:id
  */
router.get('/:id', async function (req, res) {
    try {
        const chapter = await getChapter(req, getChaptersCondition());

        if (chapter) {
            // res.json({
            //     status: true,
            //     message: '查询章节成功。',
            //     data: chapter
            // });
            // 查询章节详情
            success(res, '查询章节成功。', { chapter });
        } else {
            res.status(404).json({
                status: false,
                message: '章节未找到。',
            });
        }
    } catch (error) {
        // res.status(500).json({
        //     status: false,
        //     message: '查询章节失败。',
        //     errors: [error.message]
        // });
        failure(res, error);
    }
});
/**
 * 查询【某个课程】下的章节列表
 * GET /admin/chapters
 */
router.get('/', async function (req, res) {
    try {
        // 获取查询参数
        const query = req.query;

        if (!query.courseId) {
            throw new Error('获取章节列表失败，课程ID不能为空。');
        }

        // 获取分页所需要的两个参数，currentPage 和 pageSize
        // 如果没有传递这两个参数，就使用默认值
        // 默认是第1页
        // 默认每页显示 10 条数据
        const currentPage = Math.abs(Number(query.currentPage)) || 1;
        const pageSize = Math.abs(Number(query.pageSize)) || 10;

        // 计算offset
        const offset = (currentPage - 1) * pageSize;

        const condition = {
            ...getChaptersCondition(),
            order: [['rank', 'ASC'], ['id', 'ASC']],
            limit: pageSize,
            offset: offset
        };

        condition.where = {
            courseId: {
                [Op.eq]: query.courseId
            }
        };

        if (query.title) {
            condition.where = {
                title: {
                    [Op.like]: `%${query.title}%`
                }
            };
        }

        // 查询数据
        // const rows = await Chapter.findAll(condition);
        // 查询数据
        // 将 findAll 方法改为 findAndCountAll 方法
        // findAndCountAll 方法会返回一个对象，对象中有两个属性，一个是 count，一个是 rows，
        // count 是查询到的数据的总数，rows 中才是查询到的数据
        const { count, rows } = await Chapter.findAndCountAll(condition);
        // 返回查询结果
        // res.json({
        //     status: true,
        //     message: '查询章节列表成功。',
        //     data: {
        //         chapters
        //     }
        // });
        // 查询章节列表
        success(res, '查询章节列表成功。', {
            chapters: rows,
            pagination: {
                total: count,
                currentPage,
                pageSize,
            }
        });
    } catch (error) {
        // 返回错误信息
        // res.status(500).json({
        //     status: false,
        //     message: '查询章节列表失败。',
        //     errors: [error.message]
        // });
        failure(res, error);
    }

});
/**
 * 创建章节
 * POST /admin/chapters
 */
router.post('/', async function (req, res) {
    try {
        // 使用 req.body 获取到用户通过 POST 提交的数据，然后创建章节
        // 白名单过滤
        const body = filterBody(req);

        // 使用过滤好的 body 数据，创建章节
        const chapter = await Chapter.create(body);

        // res.status(201).json({
        //     status: true,
        //     message: '创建章节成功。',
        //     data: chapter
        // });
        // 创建章节，注意，这里状态码是：201
        success(res, '创建章节成功。', { chapter }, 201);
    } catch (error) {
        // if (error.name === 'SequelizeValidationError') {
        //     const errors = error.errors.map(e => e.message);

        //     res.status(400).json({
        //         status: false,
        //         message: '请求参数错误。',
        //         errors
        //     });
        // } else {
        //     res.status(500).json({
        //         status: false,
        //         message: '创建章节失败。',
        //         errors: [error.message]
        //     });
        // }
        failure(res, error);

    }
});
/**
 * 删除章节
 * DELETE /admin/chapters/:id
 */
router.delete('/:id', async function (req, res) {
    try {
        const chapter = await getChapter(req);

        if (chapter) {
            // 删除章节
            await chapter.destroy();

            // res.json({
            //     status: true,
            //     message: '删除章节成功。'
            // });
            // 删除章节。章节已经被删掉了，不存在了，所以不需要传 data
            success(res, '删除章节成功。');
        } else {
            res.status(404).json({
                status: false,
                message: '章节未找到。',
            });
        }
    } catch (error) {
        // res.status(500).json({
        //     status: false,
        //     message: '删除章节失败。',
        //     errors: [error.message]
        // });
        failure(res, error);
    }
});

/**
 * 更新章节
 * PUT /admin/chapters/:id
 */
router.put('/:id', async function (req, res) {
    try {
        const chapter = await getChapter(req);

        if (chapter) {
            // 白名单过滤
            const body = filterBody(req);
            await chapter.update(body);

            // res.json({
            //     status: true,
            //     message: '更新章节成功。',
            //     data: chapter
            // });
            // 更新章节
            success(res, '更新章节成功。', { chapter });
        } else {
            res.status(404).json({
                status: false,
                message: '章节未找到。',
            });
        }
    } catch (error) {
        if (error.name === 'SequelizeValidationError') {
            const errors = error.errors.map(e => e.message);

            res.status(400).json({
                status: false,
                message: '请求参数错误。',
                errors
            });
        } else {
            res.status(500).json({
                status: false,
                message: '更新章节失败。',
                errors: [error.message]
            });
        }

    }
});






module.exports = router;
